package com.dd.cloud.user.service.product.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dd.cloud.common.utils.Assert;
import com.dd.cloud.user.entity.product.ProductBuyRecord;
import com.dd.cloud.user.entity.product.ProductUseRecord;
import com.dd.cloud.user.mapper.product.ProductUseRecordMapper;
import com.dd.cloud.user.req.product.ProductUseRecordDoctorPageReq;
import com.dd.cloud.user.req.product.ProductUseRecordSystemPageReq;
import com.dd.cloud.user.res.product.ProductUseRecordDoctorPageRes;
import com.dd.cloud.user.res.product.ProductUseRecordSystemPageRes;
import com.dd.cloud.user.service.product.IProductBuyRecordService;
import com.dd.cloud.user.service.product.IProductUseRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

/**
 * @author Lx
 * @version 1.0
 * @date 2024/1/23
 */
@Slf4j
@Service
public class ProductUseRecordServiceImpl extends ServiceImpl<ProductUseRecordMapper, ProductUseRecord> implements IProductUseRecordService {
    @Autowired
    private IProductBuyRecordService productBuyRecordService;

    /**
     * 创建产品使用记录
     *
     * @param productUseRecord
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void createProductUseRecord(ProductUseRecord productUseRecord) {
        ProductBuyRecord productBuyRecord = productBuyRecordService.queryUseProductBuyRecord(productUseRecord.getDoctorId());
        if (productBuyRecord == null) {
            return;
        }
        productUseRecord.setSpType(productBuyRecord.getSpType());
        productUseRecord.setBuyId(productBuyRecord.getId());
        productUseRecord.setCreateDate(LocalDateTime.now());
        save(productUseRecord);
    }

    /**
     * 处方生成订单完善数据
     *
     * @param tencode
     * @param orderNo
     * @param actualPay
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void genOrderUpdateProductUseRecord(String tencode, String orderNo, Integer actualPay) {
        QueryWrapper<ProductUseRecord> qw = new QueryWrapper<>();
        qw.lambda().eq(ProductUseRecord::getTencode, tencode);
        ProductUseRecord productUseRecord = getOne(qw);
        if (productUseRecord == null) {
            return;
        }
        productUseRecord.setOrderNo(orderNo);
        productUseRecord.setActualPay(actualPay);
        updateById(productUseRecord);
    }

    /**
     * 收费服务产品使用记录
     *
     * @param req
     * @return
     */
    @Override
    public IPage<ProductUseRecordSystemPageRes> queryProductUseRecordSystemPage(ProductUseRecordSystemPageReq req) {
        Assert.verifyStatusIdsParam(req.getClass(), req);
        req.setType(1);
        IPage<ProductUseRecordSystemPageRes> iPage = req.pagePojo();
        iPage = getBaseMapper().queryProductUseRecordSystemPage(iPage, req);
        return iPage;
    }

    /**
     * 医生查询收费产品使用记录
     *
     * @param req
     * @return
     */
    @Override
    public IPage<ProductUseRecordDoctorPageRes> queryProductUseRecordDoctorPage(ProductUseRecordDoctorPageReq req) {
        req.setDate(LocalDateTime.now().minusMonths(18));
        IPage<ProductUseRecordDoctorPageRes> iPage = req.pagePojo();
        iPage = getBaseMapper().queryProductUseRecordDoctorPage(iPage, req);
        return iPage;
    }
}
